home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / PowerPlant / C3DMFViewer / Sources / C3DMFViewerPane.cp < prev    next >
Encoding:
Text File  |  1995-12-04  |  6.0 KB  |  226 lines  |  [TEXT/CWIE]

  1. //    C3DMFPane.cp
  2. //
  3. //    A PowerPlant application for viewing QuickDraw3D Metafiles
  4. //
  5. //    by James Jennings
  6. //    Started November 12, 1995
  7. //
  8.  
  9. #include "C3DMFViewerPane.h"
  10. #include "QD3D Debug Macros.h"
  11. #include <CodeFragments.h>    // for Has3DViewer() code
  12.  
  13. // Commands: From the Flags menu.
  14. const MessageT cmd_Q3ViewerDefault        = 9940;
  15. const MessageT cmd_Q3ViewerBadge        = 9900;
  16. const MessageT cmd_Q3ViewerActive        = 9901;
  17. const MessageT cmd_Q3ViewerControllerVisible = 9902;
  18. const MessageT cmd_Q3ViewerDrawFrame    = 9903;
  19. const MessageT cmd_Q3ViewerDraggingOff    = 9904;
  20. const MessageT cmd_Q3ViewerCamera        = 9905;
  21. const MessageT cmd_Q3ViewerTruck        = 9906;
  22. const MessageT cmd_Q3ViewerOrbit        = 9907;
  23. const MessageT cmd_Q3ViewerZoom            = 9908;
  24. const MessageT cmd_Q3ViewerDolly        = 9909;
  25.  
  26. Boolean
  27. C3DMFViewerPane::Has3DViewer(void)
  28. {
  29.     // Here are two ways of finding out if the Viewer shared library
  30.     // is installed. Neither seems to work in early versions (1.0) of QD3D.
  31. #if 1
  32.     long result;
  33.     OSErr err = ::Gestalt(gestaltQD3DViewer, &result);
  34.     return err==noErr && result == gestaltQD3DViewerAvailable;
  35. #else
  36.     return ((Boolean)Q3ViewerNew != kUnresolvedCFragSymbolAddress);
  37. #endif
  38. }
  39.  
  40. // ---------------------------------------------------------------------------
  41. //        • CreateQ3ViewerPaneStream [static]
  42. // ---------------------------------------------------------------------------
  43. //    Return a new C3DMFViewerPane object initialized using data from a Stream
  44.  
  45. C3DMFViewerPane*
  46. C3DMFViewerPane::CreateQ3ViewerPaneStream(
  47.     LStream    *inStream)
  48. {
  49.     return (new C3DMFViewerPane(inStream));
  50. }
  51.  
  52. // ---------------------------------------------------------------------------
  53. //        • C3DMFViewerPane [constructor]
  54. // ---------------------------------------------------------------------------
  55. //    
  56.  
  57. C3DMFViewerPane::C3DMFViewerPane(LStream *inStream)
  58.      : LPane(inStream), mViewer(0)
  59. {
  60.     CGrafPtr aPort = (CGrafPtr)GetMacPort();
  61.     Rect r;
  62.     if (CalcPortFrameRect(r) && Has3DViewer()) {
  63.         ::InsetRect(&r,1,1);    // shrink viewer to fit its frame into the pane
  64.         mViewer = ::Q3ViewerNew(aPort, &r, kQ3ViewerDefault);
  65.         ThrowIfQ3Any_();
  66.     }
  67.     ThrowIfNil_(mViewer);
  68. }
  69.  
  70. // ---------------------------------------------------------------------------
  71. //        • ~C3DMFViewerPane [destructor]
  72. // ---------------------------------------------------------------------------
  73. //    
  74.  
  75. C3DMFViewerPane::~C3DMFViewerPane(void)
  76. {
  77.     OSErr anErr = ::Q3ViewerDispose(mViewer);
  78.     mViewer = 0;
  79. }
  80.  
  81. void C3DMFViewerPane::UseFile(Int16 refNum)
  82. {
  83.     OSErr iErr;
  84.     ThrowIfOSErr_( iErr = ::Q3ViewerUseFile(mViewer, refNum) );
  85. }
  86.  
  87. void C3DMFViewerPane::AdjustCursorSelf(Point inPortPt, const EventRecord &inMacEvent)
  88. {
  89.     Boolean changed = ::Q3ViewerAdjustCursor(mViewer, &inPortPt);
  90. }
  91.  
  92. void
  93. C3DMFViewerPane::ClickSelf(
  94.     const SMouseDownEvent& inMouseDown )
  95. {    // pass a mouse down to the viewer
  96.     FocusDraw();    // set up the drawing environment for mouse tracking. 
  97.     // (need to cast away the const)
  98.     Boolean isViewerEvent = ::Q3ViewerEvent(mViewer, (EventRecord*)&inMouseDown.macEvent );
  99. }
  100.  
  101. /*void
  102. C3DMFViewerPane::EventMouseUp(
  103.     const EventRecord    &inMouseUp)
  104. {    // pass a mouse up to the viewer    (apparently not needed)
  105.     FocusDraw();
  106.     // (need to cast away the const)
  107.     if (!::Q3ViewerEvent(mViewer, (EventRecord*)&inMouseUp ))
  108.         LPane::EventMouseUp(inMouseUp);    // inherited: I don't know if this is necessary.
  109. }*/
  110.  
  111. void
  112. C3DMFViewerPane::DrawSelf()
  113. {
  114.     OSErr iErr = ::Q3ViewerDraw(mViewer);
  115. //    ThrowIfOSErr_(iErr);
  116. }
  117.  
  118. // MoveBy() and ResizeFrameBy() aren't needed in this app, and 
  119. // therefore havn't been tested, but they round out the class.
  120.  
  121. void
  122. C3DMFViewerPane::MoveBy(
  123.     Int32        inHorizDelta,
  124.     Int32        inVertDelta,
  125.     Boolean        inRefresh)
  126. {    // move the location of the viewer.
  127.     LPane::MoveBy(inHorizDelta, inVertDelta, inRefresh);
  128.     FitViewerToPane();
  129. }
  130.  
  131. void
  132. C3DMFViewerPane::ResizeFrameBy(
  133.     Int16        inWidthDelta,
  134.     Int16        inHeightDelta,
  135.     Boolean        inRefresh)
  136. {    // change the size of the viewer
  137.     LPane::ResizeFrameBy(inWidthDelta, inHeightDelta, inRefresh);
  138.     FitViewerToPane();
  139. }
  140.  
  141. void
  142. C3DMFViewerPane::FitViewerToPane(void)
  143. {    // helper function: used in ResizeFrameBy() and MoveBy()
  144.     Rect r;
  145.     if (CalcPortFrameRect(r)) {
  146.         ::InsetRect(&r,1,1);    // shrink viewer to fit its frame into the pane
  147.         ThrowIfOSErr_( ::Q3ViewerSetBounds(mViewer, &r) );
  148.     }
  149. }
  150.  
  151. Boolean 
  152. C3DMFViewerPane::ObeyCommand(CommandT inCommand, void *ioParam)
  153. {
  154.     Boolean cmdHandled = false;
  155.     long flags = ::Q3ViewerGetFlags(mViewer);
  156.     long oldFlags = flags;
  157.     
  158.     switch (inCommand) {
  159.     case cmd_Q3ViewerDefault:
  160.         flags = kQ3ViewerDefault;
  161.         cmdHandled = true;
  162.         break;
  163.     case cmd_Q3ViewerBadge:
  164.     case cmd_Q3ViewerActive:
  165.     case cmd_Q3ViewerControllerVisible:
  166.     case cmd_Q3ViewerDrawFrame:
  167.     case cmd_Q3ViewerDraggingOff:
  168.     case cmd_Q3ViewerCamera:
  169.     case cmd_Q3ViewerTruck:
  170.     case cmd_Q3ViewerOrbit:
  171.     case cmd_Q3ViewerZoom:
  172.     case cmd_Q3ViewerDolly:
  173.         Int16    bit = inCommand - cmd_Q3ViewerBadge;
  174.         flags ^= 1<<bit;
  175.         cmdHandled = true;
  176.         break;
  177.         
  178.     default:
  179.         cmdHandled = LCommander::ObeyCommand(inCommand, ioParam);
  180.     }
  181.     if (flags != oldFlags)
  182.         ThrowIfOSErr_(::Q3ViewerSetFlags(mViewer, flags));
  183.     
  184. #if 1    // two ways of showing the changes
  185.     Refresh();    // redraw on the next Update event
  186. #else
  187.     ThrowIfOSErr_(::Q3ViewerDraw(mViewer));    // redraw now
  188. #endif
  189.     
  190.     return cmdHandled;
  191. }
  192.  
  193. void
  194. C3DMFViewerPane::FindCommandStatus(CommandT inCommand,
  195.             Boolean &outEnabled, Boolean &outUsesMark,
  196.             Char16 &outMark, Str255 outName)
  197. {
  198.     long flags = ::Q3ViewerGetFlags(mViewer);
  199.     switch (inCommand) {
  200.     case cmd_Q3ViewerDefault:
  201.         outEnabled = true;
  202.         outUsesMark = true;
  203.         outMark = (flags == kQ3ViewerDefault)?checkMark:noMark;
  204.         break;
  205.     case cmd_Q3ViewerBadge:
  206.     case cmd_Q3ViewerActive:
  207.     case cmd_Q3ViewerControllerVisible:
  208.     case cmd_Q3ViewerDrawFrame:
  209.     case cmd_Q3ViewerDraggingOff:
  210.     case cmd_Q3ViewerCamera:
  211.     case cmd_Q3ViewerTruck:
  212.     case cmd_Q3ViewerOrbit:
  213.     case cmd_Q3ViewerZoom:
  214.     case cmd_Q3ViewerDolly:
  215.         Int16    bit = inCommand - cmd_Q3ViewerBadge;
  216.         outEnabled = true;
  217.         outUsesMark = true;
  218.         outMark = (flags & (1<<bit))?checkMark:noMark;
  219.         break;
  220.         
  221.     default:
  222.         LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName);
  223.     }
  224. }
  225.  
  226.